package com.itheima.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Slf4j
@Component
@Aspect
public class MyAdvicExpression {

    // @Pointcut("execution(public int com.itheima.service.impl.DeptServiceImpl.delete(java.lang.Integer))")
    // @Pointcut("execution(int com.itheima.service.impl.DeptServiceImpl.delete(java.lang.Integer))") // 修饰符可以省略
    // @Pointcut("execution(int delete(java.lang.Integer))") // 包名.类名可以省略, 不建议省略
    // @Pointcut("execution(int com.itheima.service.DeptService.delete(java.lang.Integer))") // 切入点表达式描述的是接口方法, 会对实现类方法进行处理
    // @Pointcut("execution(* com.*.service.DeptService.*(*))") // * 表示任意一个
    // @Pointcut("execution(* com.itheima.service.*Service.d*(*))")
    // @Pointcut("execution(* com.itheima.service.DeptService.*(..))") // ..表示任意多个包或参数
    // @Pointcut("execution(* com..DeptService.*(..))") // ..表示多个包或参数
    // @Pointcut("execution(* com.itheima.service.DeptService.list()) || execution(* com.itheima.service.DeptService.delete(java.lang.Integer))")
    // @Pointcut("!execution(* com.itheima.service.DeptService.list())")

    // 有Log注解修饰的方法都会被AOP控制
    @Pointcut("@annotation(com.itheima.anno.Log)")
    public void pt() {
    }

    @Before("pt()")
    public void before() {
        log.info("MyAdvicExpression 前置通知");
    }
}
